package com.koron.common.task.web.utils;

import com.koron.common.task.web.entity.CronTask;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

/**
 * @author twcao
 * @title: CommonUtils
 * @projectName GDH_EAM_V2
 * @description: 工具类
 * @date 2021/9/319:18
 */
public class CommonUtils {

    /**
     * cron表达式的分隔符
     */
    public static final String CRON_SPLIT = " ";

    public static Map<String, String> objToMap(Object obj) {
        Assert.notNull(obj, "obj不能为空");
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        Map<String, String> params = new HashMap<>();
        for(Field field : fields) {
            if (Modifier.isFinal(field.getModifiers())) {
                continue;
            }
            field.setAccessible(true);
            try {
                Object val = field.get(obj);
                if(val == null) {
                    continue;
                }
                params.put(field.getName(), String.valueOf(val));
            } catch (Exception e) {
            }
        }
        return params;
    }

    /**
     * 将cron表达式分解为task
     * @param cron
     * @return
     */
    public static CronTask parseCronToTask(String cron) {
        Assert.hasText(cron, "cron表达式不能为空");
        String[] cronArray = StringUtils.split(cron, CRON_SPLIT);
        CronTask task = new CronTask();
        // 秒-不存
        // 分
        task.setMins(StringUtils.equalsAny(cronArray[1], "?", "*") ? null : cronArray[1]);
        // 时
        task.setHours(StringUtils.equalsAny(cronArray[2], "?", "*") ? null : cronArray[2]);
        // 天
        task.setDays(StringUtils.equalsAny(cronArray[3], "?", "*") ? null : cronArray[3]);
        // 月
        task.setMonths(StringUtils.equalsAny(cronArray[4], "?", "*") ? null : cronArray[4]);
        // 周
        task.setWeeks(StringUtils.equalsAny(cronArray[5], "?", "*") ? null : cronArray[5]);
        // 年
        task.setYears(StringUtils.equalsAny(cronArray[6], "?", "*") ? null : cronArray[6]);
        return task;
    }
}
